iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0

在我們關閉程式時,必須要確認裡面的行為都已經處理完且當下沒有新的要求進來,才能關閉app,不然使用者更新到一半或是資料取一半,結果程式被關閉的話,會造成資料破損。

    shutdowObserver := make(chan os.Signal, 1)
	signal.Notify(shutdowObserver, syscall.SIGINT, syscall.SIGTERM)
	select {
	case s := <-shutdowObserver:
		fmt.Print(s)
		return err
	}

上面的程式碼,是透過先建立一個os.Signal的channel,然後透過signal.Notify來監控,signal.Notify第一個參數就是剛剛建立好用來監聽的channel,後面則是你要監聽的訊號。
通常會監控這些訊號:

  1. syscall.SIGINT: 使用者發送INTR字元(Ctrl+C)時觸發
  2. syscall.SIGQUIT: 使用者發送QUIT字元(Ctrl+/)時觸發
  3. syscall.SIGTERM: 結束程序

在上面的程式裡面,單純就是接收到訊號後把它印出來,但是其實可以依造訊號去設定switch,來進行不同行為,就像下面這樣:

switch s {
        case syscall.SIGQUIT:
            fmt.Print("SIGQUIT")
            //do something
            return
        case syscall.SIGSTOP:
            fmt.Print("SIGSTOP")
            //do something
            return
        case syscall.SIGHUP:
            fmt.Print("SIGHUP")
            //do something
            return
        case syscall.SIGKILL:
            fmt.Print("SIGKILL")
            //do something
            return
        case syscall.SIGUSR1:
            fmt.Print("SIGUSR1")
            //do something
            return
        default:
            fmt.Print("default")
            return
}

而在web-server要關閉時,可以先停到web-server,讓他不會再接收新任務,等內部把流程跑完後,在關閉。
不過這邊有個特例,如果程式內部panic掉,他是不會有任何訊號的,所以必須要盡量避免程式panic掉。


上一篇
Day6-啟動戰士 Cli
下一篇
Day8-Web-server 套件 Mux
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言